Modern structured development creates software functionality delivered as a set of executable files instead of single monolithic programs. Many of these files are resources such as dynamic linked libraries (e.g. DLLs). Grouping functionality into such resources allows building software that share the functionality. This allows defined groups of programmers to specialize in providing well-defined functionality quickly and correctly.
The boundaries that separate one DLL from another range from software engineering practices, abstraction and information hiding, domains of programmer's expertise, or developer group dynamics. For the sake of completeness, more functionality is often implemented in a shared resource library, than is used by any one client application.